package com.gdust.gkyx.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: Swagger2Config
 * Package: com.gdust.gkyx.common.config
 * Description:Swagger2配置信息
 *
 * @Author syun
 * @Create 2025/1/19 23:56
 * @Version 1.0
 */
@Configuration
@EnableSwagger2WebMvc// 启用 Swagger2 配置
public class Swagger2Config {

    //1
    /**
     * 配置 webApi 的 Swagger 文档生成。
     * <p>
     *     该方法用于配置前端网站的 API 文档，API 的路径以 "/api/" 开头。
     *     通过设置请求头中的 "userId" 参数，实现对每个接口的身份验证或其他鉴权操作。
     * </p>
     *
     * @return Docket 对象，配置生成 Swagger 文档的详细信息
     */
    @Bean
    public Docket webApiConfig(){
        // 创建一个全局请求参数列表，添加 token 参数
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("userId") // 请求头参数名称
                .description("用户token") // 请求头参数描述
                //.defaultValue(JwtHelper.createToken(1L, "admin"))
                .defaultValue("1") // 设置默认值
                .modelRef(new ModelRef("string")) // 设置请求参数类型为 string
                .parameterType("header") // 请求参数类型为 header
                .required(false) // 参数非必需
                .build();
        pars.add(tokenPar.build());// 将参数添加到全局请求参数列表

        // 创建 Docket 对象，用于配置 Swagger 文档
        Docket webApi = new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")// 设置该 API 的分组名称
                .apiInfo(webApiInfo())// 设置 API 的基本信息
                .select()// 配置 API 选择器
                //只显示api路径下的页面
                // /api/user/login
                // /admin/order/findAll
                // /add/PERSON/all
                .apis(RequestHandlerSelectors.basePackage("com.gdust.gkyx"))// 只显示 basePackage 包下的接口文档
                .paths(PathSelectors.regex("/api/.*"))// 只显示路径以 /api/ 开头的接口文档
                .build()
                .globalOperationParameters(pars);// 设置全局请求参数
        return webApi;
    }

    //2
    /**
     * 配置 adminApi 的 Swagger 文档生成。
     * <p>
     *     该方法用于配置后台管理系统的 API 文档，API 的路径以 "/admin/" 开头。
     *     通过设置请求头中的 "adminId" 参数，实现对后台接口的身份验证或其他鉴权操作。
     * </p>
     *
     * @return Docket 对象，配置生成 Swagger 文档的详细信息
     */
    @Bean
    public Docket adminApiConfig(){
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("adminId")
                .description("用户token")
                .defaultValue("1")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        pars.add(tokenPar.build());

        Docket adminApi = new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //只显示admin路径下的页面
                .apis(RequestHandlerSelectors.basePackage("com.gdust.gkyx"))
                .paths(PathSelectors.regex("/admin/.*"))
                .build()
                .globalOperationParameters(pars);
        return adminApi;
    }

    /**
     * 网站 API 的基本信息，用于显示 Swagger 文档中的元数据部分。
     * <p>
     *     配置文档的标题、描述、版本、联系人信息等。
     * </p>
     *
     * @return ApiInfo 对象，包含文档的基本信息
     */
    private ApiInfo webApiInfo(){
        return new ApiInfoBuilder()
                .title("网站-API文档")
                .description("本文档描述了尚上优选网站微服务接口定义")
                .version("1.0")
                .contact(new Contact("gdust", "http://gdust.com", "gdust"))
                .build();
    }

    /**
     * 后台管理系统 API 的基本信息，用于显示 Swagger 文档中的元数据部分。
     * <p>
     *     配置文档的标题、描述、版本、联系人信息等。
     * </p>
     *
     * @return ApiInfo 对象，包含文档的基本信息
     */
    private ApiInfo adminApiInfo(){
        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")// 设置文档的标题
                .description("本文档描述了广科优选后台系统服务接口定义")// 设置文档的描述
                .version("1.0")// 设置版本号
                .contact(new Contact("gdust", "http://gdust.com", "gdust"))// 设置联系人的信息
                .build();// 构建 ApiInfo 对象
    }
}

